package 实验一_斐波那契数列实现算法与分析;

/**
 * by 孙彪2215805342 2025.2.28
 * 斐波那契数
 */
public class Test {

    // 计算第 n 个斐波那契数（迭代法）
    public static long fibonacci(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        long a = 0, b = 1, c = 0;
        for (int i = 2; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return b;
    }

    public static void main(String[] args) {
        // 使用 ArrayList 存储斐波那契数列，设定长度为 10
        java.util.ArrayList<Long> fibList = new java.util.ArrayList<>();
        int size = 10;

        // 计算斐波那契数并记录运行时间
        for (int i = 0; i < size; i++) {
            long start = System.nanoTime();
            long fib = fibonacci(i);
            long end = System.nanoTime();
            long duration = end - start;
            System.out.println("计算斐波那契数 F(" + i + ") = " + fib + " 耗时: " + duration + " ns");
            fibList.add(fib);
        }

        // 打印初始数列
        // 输出格式示例：10	25 32 47 54 16 74 82 19 30
        // 这里打印生成的斐波那契数列（数值可与示例不同）
        for (Long num : fibList) {
            System.out.print(num + " ");
        }
        System.out.println("");

        System.out.println("长度为" + fibList.size());
        //System.out.println();

        // 取出第 i 个元素（假设 i=3，1-索引）
        int iPos = 3;
        System.out.println("待获取的元素的位置i=" + iPos);
        if(iPos - 1 < fibList.size()){
            System.out.println("第i个元素为" + fibList.get(iPos - 1));
        } else {
            System.out.println("位置超出范围");
        }
        //System.out.println();

        // 查找元素：这里选取数列中第 4 个元素作为待查找的元素（与示例中 x=47 类似，1-索引）
        long x = fibList.get(3);
        System.out.println("待查找的元素x=" + x);
        int index = fibList.indexOf(x);
        if(index != -1){
            System.out.println("元素x的位置为" + (index + 1));
        } else {
            System.out.println("没有找到元素x");
        }
        //System.out.println();

        // 插入操作：在位置 h=2（1-索引）插入元素 m=24
        int h = 2;
        int m = 24;
        System.out.println("插入位置h=" + h);
        System.out.println("插入元素m=" + m);
        if(h - 1 <= fibList.size()){
            fibList.add(h - 1, (long) m);
            System.out.println("插入成功");
        } else {
            System.out.println("插入位置不合法");
        }
        //System.out.println();

        // 按要求将数列分为两部分输出（示例：前 4 个数一行，其余另一行）
        for (int i = 0; i < fibList.size(); i++) {
            if(i == 4) System.out.println();
            System.out.print(fibList.get(i) + " ");
        }
        System.out.println("");

        // 删除操作：删除位置 a=6（1-索引）的元素
        int a = 6;
        System.out.println("待删除的元素的位置a=" + a);
        if(a - 1 < fibList.size()){
            fibList.remove(a - 1);
            System.out.println("删除成功");
        } else {
            System.out.println("删除位置不合法");
        }
        //System.out.println();

        // 删除后打印完整数列
        for (Long num : fibList) {
            System.out.print(num + " ");
        }
        System.out.println("");

        // 判断是否为空表
        if(fibList.isEmpty()){
            System.out.println("空表");
        } else {
            System.out.println("不是空表");
        }
        // 再次打印数列
        for (Long num : fibList) {
            System.out.print(num + " ");
        }
        System.out.println("");

        System.out.println("Press any key to continue_");
    }
}
